<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>RabbitMQ 学习笔记 | 个人博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="categories: MQ—                                       RabbitMQ 学习笔记 RPC主要基于TCP&#x2F;UDP协议，HTTP协议是应用层协议，是构建在传输层协议TCP之上的，RPC效率更高，RPC长连接：不必每次通信都像HTTP一样三次握手，减少网络开销； HTTP服务开发迭代更快：在接口不多，系统与系统之间交互比较少的情况下，HTTP就显得">
<meta property="og:type" content="article">
<meta property="og:title" content="RabbitMQ 学习笔记">
<meta property="og:url" content="http://codercheng.cn/2021/01/26/RabbitMQ%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/index.html">
<meta property="og:site_name" content="个人博客">
<meta property="og:description" content="categories: MQ—                                       RabbitMQ 学习笔记 RPC主要基于TCP&#x2F;UDP协议，HTTP协议是应用层协议，是构建在传输层协议TCP之上的，RPC效率更高，RPC长连接：不必每次通信都像HTTP一样三次握手，减少网络开销； HTTP服务开发迭代更快：在接口不多，系统与系统之间交互比较少的情况下，HTTP就显得">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://gitee.com/adc123321/blog_img/raw/master/image/202101/26/171322-46544.png">
<meta property="article:published_time" content="2021-01-26T09:04:12.939Z">
<meta property="article:modified_time" content="2021-03-03T07:29:21.879Z">
<meta property="article:author" content="CoderCheng">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://gitee.com/adc123321/blog_img/raw/master/image/202101/26/171322-46544.png">
  
    <link rel="alternate" href="/atom.xml" title="个人博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.lug.ustc.edu.cn/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/css/style.css">

<meta name="generator" content="Hexo 4.2.1"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">个人博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://codercheng.cn"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-RabbitMQ 学习笔记" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2021/01/26/RabbitMQ%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" class="article-date">
  <time datetime="2021-01-26T09:04:12.939Z" itemprop="datePublished">2021-01-26</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      RabbitMQ 学习笔记
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <hr>
<p>categories: MQ<br>—                                       RabbitMQ 学习笔记</p>
<p>RPC主要基于TCP/UDP协议，HTTP协议是应用层协议，是构建在传输层协议TCP之上的，RPC效率更高，RPC长连接：不必每次通信都像HTTP一样三次握手，减少网络开销；</p>
<p>HTTP服务开发迭代更快：在接口不多，系统与系统之间交互比较少的情况下，HTTP就显得更加方便；相反，在接口比较多，系统与系统之间交互比较多的情况下，HTTP就没有RPC有优势。</p>
<p> <strong>分布式同步通信的问题</strong></p>
<p>电商项目中，如果后台添加商品信息，该信息放到数据库。我们同时，需要更新搜索引擎的倒排索引同时，假如有商品页面的静态化处理，也需要更新该页面信息</p>
<p>归根到底，是同步调用处理不当。这个问题在分布式架构中尤为严重。</p>
<p>消息中间件也可以称消息队列，是指用高效可靠的消息传递机制进行与平台无关的数据交流，并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型，可以在分布式环境下扩展进程的通信</p>
<p>消息中间件就是在通信的上下游之间截断：break it，Broker 然后利用中间件解耦、异步的特性，构建弹性、可靠、稳定的系统。</p>
<p><strong>异步处理</strong>、<strong>流量削峰</strong>、限流、缓冲、排队、<strong>最终一致性</strong>、<strong>消息驱动</strong>等需求的场景都可以使用消息中间件</p>
<p><strong>RabbitMQ</strong></p>
<p>RabbitMQ开始是用在电信业务的可靠通信的，也是少有的几款支持AMQP协议的产品之一。</p>
<p>优点：</p>
<ol>
<li><p>轻量级，快速，部署使用方便</p>
</li>
<li><p>支持灵活的路由配置。RabbitMQ中，在生产者和队列之间有一个交换器模块。根据配置的路</p>
</li>
</ol>
<p>由规则，生产者发送的消息可以发送到不同的队列中。路由规则很灵活，还可以自己实现。</p>
<ol start="3">
<li>RabbitMQ的客户端支持大多数的编程语言。</li>
</ol>
<p>缺点：</p>
<ol>
<li><p>如果有大量消息堆积在队列中，性能会急剧下降</p>
</li>
<li><p>RabbitMQ的性能在Kafka和RocketMQ中是最差的，每秒处理几万到几十万的消息。如果应</p>
</li>
</ol>
<p>用要求高的性能，不要选择RabbitMQ。 </p>
<ol start="3">
<li>RabbitMQ是Erlang开发的，功能扩展和二次开发代价很高。</li>
</ol>
<p><strong>RabbitMQ工作流程详解</strong></p>
<p> <strong>生产者发送消息的流程</strong></p>
<ol>
<li><p>生产者连接RabbitMQ，建立TCP连接( Connection)，开启信道（Channel） </p>
</li>
<li><p>生产者声明一个Exchange（交换器），并设置相关属性，比如交换器类型、是否持久化等</p>
</li>
<li><p>生产者声明一个队列井设置相关属性，比如是否排他、是否持久化、是否自动删除等</p>
</li>
<li><p>生产者通过 bindingKey （绑定Key）将交换器和队列绑定（ binding ）起来</p>
</li>
<li><p>生产者发送消息至RabbitMQ Broker，其中包含 routingKey （路由键）、交换器等信息</p>
</li>
<li><p>相应的交换器根据接收到的 routingKey 查找相匹配的队列。</p>
</li>
<li><p>如果找到，则将从生产者发送过来的消息存入相应的队列中。</p>
</li>
<li><p>如果没有找到，则根据生产者配置的属性选择丢弃还是回退给生产者</p>
</li>
<li><p>关闭信道。</p>
</li>
<li><p>关闭连接。</p>
</li>
</ol>
<p><strong>消费者接收消息的过程</strong></p>
<ol>
<li><p>消费者连接到RabbitMQ Broker ，建立一个连接(Connection ) ，开启一个信道(Channel) 。 </p>
</li>
<li><p>消费者向RabbitMQ Broker 请求消费相应队列中的消息，可能会设置相应的回调函数， 以及做一些准备工作</p>
</li>
<li><p>等待RabbitMQ Broker 回应并投递相应队列中的消息， 消费者接收消息。</p>
</li>
<li><p>消费者确认( ack) 接收到的消息。</p>
</li>
<li><p>RabbitMQ 从队列中删除相应己经被确认的消息。</p>
</li>
<li><p>关闭信道。</p>
</li>
<li><p>关闭连接。</p>
</li>
</ol>
<p>RabbitMQ TTL 机制    死信队列        延迟队列</p>
<p>RabbitMQ 可以<strong>对消息和队列两个维度来设置TTL</strong>。</p>
<p>任何消息中间件的容量和堆积能力都是有限的，如果有一些消息总是不被消费掉，那么需要有一种过期的机制来做兜底。</p>
<p>目前有两种方法可以设置消息的TTL。 </p>
<ol>
<li><p>通过Queue属性设置，队列中所有消息都有相同的过期时间。</p>
</li>
<li><p>对消息自身进行单独设置，每条消息的TTL 可以不同。</p>
</li>
</ol>
<p>如果两种方法一起使用，则消息的TTL 以两者之间<strong>较小数值为准</strong>。通常来讲，消息在队列中的生存时间一旦超过设置的TTL 值时，就会变成“死信”(Dead Message)，消费者默认就无法再收到该消息。当然，“死信”也是可以被取出来消费的</p>
<p>  一般 固定时长 用TTL+死信队列   比如 订单取消</p>
<p><strong>延迟消息</strong>是指的消息发送出去后并不想立即就被消费，而是需要等（指定的）一段时间后才触发消费。</p>
<p>可以使用<strong>rabbitmq_delayed_message_exchange</strong>插件实现。</p>
<p>这里和TTL方式有个很大的不同就是TTL存放消息在死信队列(delayqueue)里，二基于插件存放消息在延时交换机里(x-delayed-message exchange)。 </p>
<p><img src="https://gitee.com/adc123321/blog_img/raw/master/image/202101/26/171322-46544.png" alt="image-20210126171322013"></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://codercheng.cn/2021/01/26/RabbitMQ%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" data-id="cko3snvws000fi8uo3y2ffpgk" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2021/02/10/Kafka%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          Kafka学习笔记
        
      </div>
    </a>
  
  
    <a href="/2021/01/15/redis%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">redis常用命令</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java/">Java</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/MySql/">MySql</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Netty/">Netty</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringBoot/">SpringBoot</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringCloud/">SpringCloud</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringMVC/">SpringMVC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Tomcat/">Tomcat</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Zookeeper/">Zookeeper</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E4%BD%9C%E4%B8%9A/">作业</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E8%B0%83%E5%BA%A6/">分布式调度</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%A1%86%E6%9E%B6/">框架</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%9F%A5%E8%AF%86/">知识</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2024/08/">八月 2024</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/09/">九月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/08/">八月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/04/">四月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/02/">二月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/11/">十一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/06/">六月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/05/">五月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/04/">四月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/03/">三月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/02/">二月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/01/">一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/12/">十二月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/11/">十一月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/10/">十月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/09/">九月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/08/">八月 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2024/08/28/CentOS%E5%86%85%E5%AD%98cpu%E6%8E%92%E6%9F%A5/">CentOS内存cpu排查</a>
          </li>
        
          <li>
            <a href="/2022/09/22/Linux%20%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97%E5%91%BD%E4%BB%A4/">Linux 查看日志命令</a>
          </li>
        
          <li>
            <a href="/2022/08/30/dubbo%20%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/">dubbo 常见问题</a>
          </li>
        
          <li>
            <a href="/2022/04/26/1%20%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0/">1 源码笔记</a>
          </li>
        
          <li>
            <a href="/2022/02/24/jvisualVM%20%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0/">jvisualVM 使用笔记</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2024 CoderCheng<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//code.jquery.com/jquery-2.0.3.min.js"></script>


  
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">

  
<script src="/fancybox/jquery.fancybox.pack.js"></script>




<script src="/js/script.js"></script>




  </div>
</body>
</html>